<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
		"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
	<title>robot Tree Mouse Test</title>

	<style>
		@import "../../../../util/doh/robot/robot.css";
	</style>

	<script type="text/javascript" src="../../../../dojo/dojo.js"></script>

	<script type="text/javascript">
		require([
			"doh/runner", "dojo/robotx",
			"dojo/aspect", "dojo/query",
			"dijit/tests/helpers", "dojo/domReady!"
		], function(doh, robot, aspect, query, helpers){

			robot.initRobot('../test_Tree.html');

			var registry, focus, mytree, africa, asia;

			doh.register("_setup", [
				{
					name: "wait for widgets to load",
					timeout: 20000,
					runTest: helpers.waitForLoad
				},
				function setVars(){
					registry = robot.window.require("dijit/registry");
					focus = robot.window.require("dijit/focus");
					mytree = registry.byId("mytree");

					// find TreeNodes for Africa, Asia (this assumes that we haven't loaded any of mytree's
					// grandchild TreeNodes yet)
					var nodes = query(".dijitTreeLabel");
					africa = registry.getEnclosingWidget(nodes[1]);
					asia = registry.getEnclosingWidget(nodes[2]);
				}
			]);

			function toggle(func, expanded){
				return function(){
					var d = new doh.Deferred();

					doh.is(expanded, africa.isExpanded, "original state");

					func(d);

					robot.sequence(d.getTestCallback(function(){
						doh.is(!expanded, africa.isExpanded, "after state");
					}), 500);

					return d;
				};
			}

			doh.register("label click", [
				{
					name: "click to open",
					timeout: 8000,
					runTest: toggle(function(d){
						robot.mouseMoveAt(africa.labelNode);
						robot.mouseClick({left:true}, 100);
						robot.sequence(d.getTestErrback(function(){
							doh.is(1, robot.window.mouseDowns, "mouse down reported");
						}), 500);
					}, false)
				},

				{
					name: "click to close",
					timeout: 8000,
					runTest: toggle(function(){
						robot.mouseClick({left:true}, 100);
					}, true)
				},

				{
					name: "double click to open",
					timeout: 8000,
					setUp: function(){
						mytree.openOnClick = false;
						mytree.openOnDblClick = true;
					},
					runTest: toggle(function(){
						robot.mouseClick({left:true}, 100);
						robot.mouseClick({left:true}, 100);
					}, false)
				},

				{
					name: "double click to close",
					timeout: 8000,
					runTest: toggle(function(){
						robot.mouseClick({left:true}, 100);
						robot.mouseClick({left:true}, 100);
					}, true)
				}
			]);

			doh.register("not a click", [
				{
					name: "setup",
					timeout: 8000,
					runTest: function(){
						mytree.set("openOnClick", true);
						return mytree.collapseAll().then(function(){
							return mytree.set("path", ["continentRoot", "EU", "FR"]);
						});
					}
				},

				{
					name: "mouse down france, up on italy",
					timeout: 8000,
					runTest: function(){
						var labels = query(".dijitTreeLabel"),
							europe = labels.filter(function(node){
								return node.innerHTML == "Europe";
							})[0],
							france = labels.filter(function(node){
								return node.innerHTML == "France";
							})[0],
							italy = labels.filter(function(node){
								return node.innerHTML == "Italy";
							})[0];

						var d = new doh.Deferred();

						robot.mouseMoveAt(france, 500, 0);
						robot.mousePress({left:true}, 500);
						robot.mouseMoveAt(italy, 500, 0);
						robot.mouseRelease({left:true}, 500);
						robot.sequence(d.getTestCallback(function(){
							var europeNode = registry.getEnclosingWidget(europe);
							doh.t(europeNode.isExpanded, "europe node still expanded");
							doh.isNot("Europe", mytree.focusedChild.label, "focus didn't shift to Europe");
						}), 500);

						return d;
					}
				}
			]);

			doh.register("focus", [
				{
					name: "setup",
					runTest: function(){
						// prevent TreeNodes from moving around as we are moving the mouse to find them
						mytree.set("openOnClick", false);
					}
				},
				{
					name: "focus africa",
					timeout: 8000,
					runTest: function(){
						var d = new doh.Deferred();
						robot.mouseMoveAt(africa.labelNode);
						robot.mouseClick({left:true}, 100);
						robot.sequence(d.getTestCallback(function(){
							doh.is("Africa", helpers.innerText(focus.curNode));
						}), 500);
						return d;
					}
				},

				{
					name: "blur tree",
					timeout: 8000,
					runTest: function(){
						var d = new doh.Deferred();
						robot.mouseMoveAt("mytree_before");
						robot.mouseClick({left:true}, 100);
						robot.sequence(d.getTestCallback(function(){
							doh.is("mytree_before", focus.curNode.id);
						}), 500);
						return d;
					}
				},

				{
					name: "click on asia's expando",
					timeout: 8000,
					runTest: function(){
						var d = new doh.Deferred(),
							africaGotFocus;
						aspect.after(africa, "focus", function(){
							africaGotFocus = true;
						});
						robot.mouseMoveAt(asia.expandoNode);
						robot.mouseClick({left:true}, 100);
						robot.sequence(d.getTestCallback(function(){
							// Clicking the expando or anywhere on the row should focus that row.
							// In addition, there shouldn't even be a momentary (possibly scroll inducing) focus on
							// the previously focused row.
							doh.is("Asia", helpers.innerText(focus.curNode));
							doh.f(africaGotFocus, "africa didn't get momentary focus");
						}), 500);
						return d;
					}
				},

				{
					name: "focus long label",
					timeout: 8000,
					runTest: function(){
						var d = new doh.Deferred();
						var thinTree = registry.byId('thinTree');
						var rootNode = thinTree.rootNode;

						robot.mouseMoveAt(rootNode.expandoNode);
						robot.mouseClick({left: true}, 100);
						robot.sequence(d.getTestCallback(function(){
							doh.f(rootNode.isExpanded, 'Clicking expando of node with long label should collapse node');
							doh.is(0, thinTree.domNode.scrollLeft, 'Focusing node with long label should not scroll container');
						}), 500);
						return d;
					}
				}
			]);

			doh.run();
		});

	</script>
</head>
</html>

